home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / pctj8409.arc / EPSON.ASM < prev    next >
Assembly Source File  |  1986-09-14  |  8KB  |  215 lines

  1. NAME EPSON
  2. PAGE 55,132
  3. TITLE EPSON.COM - DOUGLAS RITARI - 12/6/83
  4. ;**********************************************************************
  5. ;  EPSON.COM   - Version 1.0 - Setup Utility for Epson Printer
  6. ;  by:  Douglas Ritari
  7. ;  DATE:  December 6, 1983
  8. ;**********************************************************************
  9. ;
  10. MAIN    SEGMENT    PARA PUBLIC 'CODE'
  11.      ORG    100H
  12. START    PROC    FAR
  13. ;
  14.      ASSUME    CS:MAIN
  15.      ASSUME    DS:MAIN
  16.      ASSUME    SS:MAIN
  17.      ASSUME     ES:MAIN
  18. ;
  19.      JMP    SSTART    ;JUMP TO REAL START OF PROGRAM
  20. ;
  21. ;************* INITIALIZE DATA VARIABLES ******************************
  22. ;
  23. SWITCH    DB    0    ;SWITCH FOR HEX '/' SEQ.- EITHER '0' OR 'FFH'
  24. SIXTEEN    DB    16     ;THE NUMBER '16' USED IN HEX CONVERSION - MUL.
  25. TESTPR    DB    0    ;SWITCH TO TEST IF ANY OUTPUT WAS PRODUCED
  26. DIGITS    DB    0    ;NUM. OF HEX DIGITS PROCESSED - '0' OR '1'
  27. HEX    DB    0    ;HEXADECIMAL ACCUMLATOR
  28. PARM    DB    0     ;MOVE PARAMETER TO HERE - 1 BYTE AT A TIME
  29. ;
  30. ;**********************************************************************
  31. ;  BEGIN PROGRAM - SAVE RETURN ADDRESS TO DOS
  32. ;**********************************************************************
  33. ;
  34. SSTART:
  35.      PUSH    DS    ;SAVE PSP SEGMENT ADDRESS
  36.      MOV    AX,0
  37.      PUSH    AX    ;SAVE RETURN ADDRESS OFFSET (PSP + 0)
  38. ;
  39. ;*************** MOVE COUNT OF CHARACTERS INTO PARM AREA **************
  40. ;
  41.      MOV    SI,80H    ;SOURCE STRING OFFSET (WITHIN PSP)
  42.      MOV     DI,OFFSET PARM ;DEST. STRING OFFSET
  43.      CLD         ;SET 'FORWARD' STRING OPERATIONS
  44.      MOVSB         ;MOVE # OF PARMS ENTERED INTO 'PARM' VARIABLE
  45.      DEC    DI
  46. ;
  47. ;************ SET UP PARM FIELD'S POINTERS ****************************
  48. ;
  49.     MOV    AL,PARM    ;PUT NUMBER OF CHAR. IN PARM IN AL REGISTER
  50.      MOV    CX,AX    ;PUT NUMBER OF CHAR. IN PARM IN CX REGISTER
  51.         MOV    BX,OFFSET PARM  ;POINT TO PARMS BASE ADDRESS
  52.      CMP     CX,0    ;WERE 'NO' PARMS ENTERED ?
  53.      JE    SEAREN    ;SEND DEFAULTS - NO PARMS - END PROGRAM
  54. ;
  55. ;**********************************************************************
  56. ;  PARM(S) WERE ENTERED - SEARCH FOR AND PROCESS PARMAMETERS 
  57. ;**********************************************************************
  58. ;
  59. SEAR:    MOVSB         ;READ IN PARM FROM PROG. SEGMENT PREFIX
  60.     DEC    DI
  61.      MOV    AL,[BX]    ;MOVE NEXT PARM TO INPUT REGISTER
  62.      CMP    AL,96    ;96 IS THE SMALL LETTER 'A'
  63.      JL    SEARCP  ;DO 'NOT' MODIFY THIS LETTER IF LOWER THAN 'a'
  64.      AND    AL,223    ;REDUCE BY 32 - UNCAPS===> CAPS
  65. SEARCP: CMP    AL,'/'    ;HEX SEQUENCE BEGUN OR TERMINATED
  66.      JE    TOGGLE    ;TURN ESCAPE SEQUENCE FLAG ON OR OFF
  67.      MOV    AH,0    ;CLEAR AH REGISTER
  68.      CMP    AH,SWITCH    ;IS HEX SEQUENCE OFF ?
  69.      JNE    PASTHRU    ;PRINT CHAR.'S HEX VALUE IF HEX SWITCH IS ON
  70.     CMP    AL,'E'    ;PARM TO 'EMPHASIZE' ?
  71.     JE    PARM_E    ;PARM-E ROUTINE
  72.      CMP    AL,'D'    ;PARM TO 'DOUBLE-STRIKE' ?
  73.     JE    PARM_D    ;JUMP TO PARM-D ROUTINE
  74.      CMP    AL,'C'    ;PARM TO 'COMPRESS' ?
  75.     JE    PARM_C    ;JUMP TO COMPRESS ROUTINE
  76.      CMP    AL,'T'    ;PARM TO 'GOTO TOP-OF-FORM' ?
  77.      JE    PARM_T    ;JUMP TO TOP-OF-FORM ROUTINE
  78.      CMP    AL,'R'    ;PARM TO 'REINITIALIZE PRINTER' ?
  79.      JE    PARM_R    ;JUMP TO RESET ROUTINE
  80.      CMP    AL,'I'    ;PARM TO SET 'ITALIC' CHAR. ?
  81.      JE    PARM_I    ;JUMP TO ITALICS ROUTINE
  82.      CMP    AL,'U'    ;PARM TO SET 'UNI-DIRECTIONAL' PRINT MODE ?
  83.      JE    PARM_U    ;JUMP TO 'UNI-DIRECTIONAL' ROUTINE
  84.      CMP    AL,'W'    ;PARM TO SET 'WIDE' PRINT MODE ?
  85.      JE    PARM_W    ;JUMP TO WIDE ROUTINE
  86. SEARBK:    LOOP    SEAR    ;LOOP BACK FOR OTHER PARMS
  87. ;
  88. SEAREN:    JMP    PGMEND    ;JUMP END-PROGRAM PROCEDURE
  89. ;
  90. ;********* BACKSLASH TOGGLES HEXIDECIMAL INPUT MODE ON/OFF ************
  91. ;
  92. ;  TOGGLE THE HEXADECIMAL INPUT PROC.-OFF===>ON  - OR  ON===>OFF
  93. ;
  94. TOGGLE:    NOT    SWITCH
  95.      JMP    SEARBK    ;RETURN TO PARM SEARCH PROCEDURE
  96. ;
  97. ;********** EDIT FOR VALID HEXIDECIMAL NUMBERS ************************
  98. ;
  99. PASTHRU: SUB    AL,30H    ;CONVERT FROM ASCII REPRES. TO REAL NUMBERS
  100.      JC    BELEND    ;END PROGRAM IF WRONG PARM - SOUND BELL
  101.      CMP    AL,9    ;CHECK FOR DIGIT > 9
  102.      JBE    PASTHR2    ;VALID NUMBER - JUMP TO MATH ROUTINE CALL
  103.      SUB     AL,7    ;CONVERT FROM ASCII REPRES. TO HEX DIGITS A-F
  104.      JC    BELEND    ;END PROGRAM IF WRONG PARM - SOUND BELL
  105.     CMP    AL,0FH    ;CHECK FOR DIGIT > '15' HEX
  106.      JA    BELEND    ;END PROGRAM IF WRONG PARM - SOUND BELL
  107. PASTHR2: CALL    HEXMATH    ;CONVERT INPUT PARM TO HEX-NUMBER
  108.      JMP    SEARBK    ;RETURN FOR NEXT PARM
  109. ;
  110. ;******** PRE-DEFINED EPSON PRINTER PARMS PROCEDURE *******************
  111. ;
  112. PARM_E:    MOV     AL,45H    ;CODE FOR 'EMPHASIZED' FONT
  113.      CALL     ESCAPE
  114.      JMP     SEARBK
  115. ;
  116. PARM_D: MOV    AL,47H    ;CODE FOR 'DOUBLE-STRIKE' MODE
  117.      CALL    ESCAPE
  118.     JMP    SEARBK
  119. ;
  120. PARM_C:    MOV    AL,0FH    ;CODE FOR 'COMPRESSED' FONT
  121.      CALL    PRINTER    ;COMPRESSED MODE DOES 'NOT' NEED PRE-ESCAPE SEQ
  122.      JMP    SEARBK
  123. ;
  124. PARM_T:    MOV    AL,0CH    ;CODE TO 'ADVANCE PAPER TO TOP-OF-FORM'
  125.      CALL     PRINTER    ;FORM-FEED TO TOP-OF-FORM DOESN'T NEED ESC.
  126.      JMP    SEARBK
  127. ;
  128. PARM_R:    MOV     AL,40H    ;CANCEL ALL MODES/RESET LOGICAL TOP-OF-FORM
  129.           CALL    ESCAPE
  130.      JMP    SEARBK
  131. ;
  132. PARM_I:    MOV    AL,34H    ;CODE FOR 'ITALICS' FONT
  133.      CALL     ESCAPE
  134.      JMP    SEARBK
  135. ;
  136. PARM_U:    MOV    AL,55H    ;TURN ON UNI-DIRECTIONAL PRINT MODE
  137.      CALL     ESCAPE
  138.      MOV     AL,1    ;CODE TO SET UNI-DIRECTIONAL 'ON'
  139.      CALL    PRINTER
  140.      JMP    SEARBK
  141. ;
  142. PARM_W:    MOV    AL,57H    ;CODE FOR 'PERMANENT DOUBLE-WIDE' FONT
  143.      CALL    ESCAPE    
  144.      MOV    AL,1    ;CODE TO SET WIDE 'ON'
  145.      CALL     PRINTER
  146.      JMP    SEARBK
  147. ;
  148. ;*************** END OF PROGRAM PROCEDURE *****************************
  149. ;
  150. ;  RESTORE CONTROL TO DOS - END OF PROGRAM
  151. ;
  152. BELEND:    MOV     DIGITS,0    ;CLEAR 'UNPAIRED DIGITS' HEX CHECK
  153.            MOV    AL,07H         ;BAD PARMS IN PROGRAM - SOUND BELL
  154.      CALL    PRINTER         ;PROGRAM ENDED WITH ERRORS!
  155. PGMEND:    CMP    DIGITS,0    ;WAS 'UNPAIRED' HEXCODES ENTERED?
  156.      JNE    BELEND         ;SOUND BELL TO SIGNAL ERROR
  157.      CMP    TESTPR,0    ;
  158.      JE    DEFAULT         ;NO OUTPUT WAS PRODUCED - SEND DEFAULT
  159. ;
  160.     RET              ;RETURN TO DOS - END OF PROGRAM.
  161. ;
  162. ;**********************************************************************
  163. ;  NO PARMS WERE ENTERED - DEFAULT SETTING OF DOUBLE-STRIKE/EMPHASIZE
  164. ;**********************************************************************
  165. ;
  166. DEFAULT: MOV    AL,47H    ;PUT 'DOUBLE-STRIKE' CODE IN OUTPUT REGISTER
  167.      CALL    ESCAPE
  168.      MOV    AL,45H  ;PUT 'EMPHASIZE' CODE IN OUTPUT REGISTER
  169.      CALL    ESCAPE
  170.      JMP    PGMEND    ;JUMP TO END-OF-PROGRAM ROUTINE
  171. ;
  172.      START    ENDP
  173. ;
  174. ;********** ESCAPE SUBROUTINE - SEND ESCAPE CODE TO PRINTER ***********
  175. ;
  176. ESCAPE     PROC    NEAR    
  177.          PUSH    AX    ;SAVE POTENTIAL CHAR. TO BE PRINTED ON STACK
  178.      MOV    AL,1BH  ;MOVE ESCAPE CHAR.(1BH) TO OUT REG.
  179.      CALL    PRINTER    ;CALL PRINTER SUBROUTINE
  180.     POP    AX    ;GET CHAR. TO BE PRINTED FROM STACK
  181.      CALL    PRINTER    ;CALL PRINTER OUTPUT ROUTINE
  182.     RET         ;RETURN TO CALLING SUBROUTINE
  183. ESCAPE    ENDP
  184. ;
  185. ;********* PRINTER SUBROUTINE - ALL PRINTING IS DONE HERE *************
  186. ;
  187. ;  SEND CHARACTER IN AL REGISTER TO PRINTER
  188. ;
  189. PRINTER    PROC    NEAR
  190.      MOV    TESTPR,1    ;VALID OUTPUT HAS BEEN PRODUCED
  191.            MOV     DX,0    ;SET REGISTER FOR PRINTER OUTPUT INTERRUPT
  192.      MOV    AH,0    ;SET REGISTER FOR PRINTER OUTPUT INTERRUPT
  193.      INT     17H    ;CALL PRINTER DRIVER IN BIOS
  194.     RET         ;RETURN TO CALLING SUBROUTINE
  195. PRINTER    ENDP
  196. ;
  197. ;********* CONVERT INPUT PARMS TO HEXIDECIMAL NUMBERS *****************
  198. ;
  199. HEXMATH    PROC    NEAR         ;ROUTINE TO CONVERT PARM TO HEX NUMBERS
  200.      CMP    DIGITS,0    ;0===> 1ST #   -   1===> 2ND #
  201.      JNE    MATH2         ;JUMP & PROCESS 2ND #
  202.      MUL    SIXTEEN         ;MULTIPLE 1ST # BY 16
  203.      MOV     HEX,AL         ;CLEAR & STORE RESULT IN 'HEX'
  204.      INC    DIGITS         ;1ST NUMBER PROCESSED
  205.     RET              ;RETURN TO PASTHRU ROUTINE
  206. MATH2:    ADD    AL,HEX         ;TOTAL THE TWO HEX DIGITS
  207.      MOV    DIGITS,0    ;CLEAR DIGIT VARIABLE FOR FUTURE PARMS
  208.      CALL    PRINTER         ;SEND HEX # IN 'AL' REGISTER TO PRINTER
  209.     RET              ;RETURN TO PASTHRU ROUTINE
  210. HEXMATH    ENDP
  211. ;
  212. ;**********************************************************************
  213. MAIN    ENDS
  214.      END    START
  215.